【MySQL基础】String类型 CHAR和VARCHAR类型等 |
您所在的位置:网站首页 › char 和 string的区别 › 【MySQL基础】String类型 CHAR和VARCHAR类型等 |
主要讨论以下主题: · CHAR 和 VARCHAR介绍以及工作? · CHAR 和 VARCHAR 区别 · CHAR(4) 和 VARCAHR(4)区别 · 了解TEXT 和 BLOB · 了解ENUM 字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。 1. String类型 1.1. CHAR和VARCHAR类型 CHAR tʃɑː VARCHAR vɑ:(r) CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。 CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。 CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。 VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。 同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。 VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。
下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别: 值 CHAR(4) 存储需求 VARCHAR(4) 存储需求 '' ' ' 4个字节 '' 1个字节 'ab' 'ab ' 4个字节 'ab ' 3个字节 'abcd' 'abcd' 4个字节 'abcd' 5个字节 'abcdefgh' 'abcd' 4个字节 'abcd' 5个字节 请注意上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值不保存,并且会出现错误。 从CHAR(4)和VARCHAR(4)列检索的值并不总是相同,因为检索时从CHAR列删除了尾部的空格。具体例子可以参考mysql手册。 1.2. BLOB和TEXT类型 BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。 有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。 BLOB 列被视为二进制字符串(字节字符串)。TEXT列被视为非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值值。TEXT列有一个字符集,并且根据字符集的 校对规则对值进行排序和比较。 在TEXT或BLOB列的存储或检索过程中,不存在大小写转换。 在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列。同样,可以将TEXT列视为VARCHAR列。BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR: · 当保存或检索BLOB和TEXT列的值时不删除尾部空格。(这与VARBINARY和VARCHAR列相同)。 请注意比较时将用空格对TEXT进行扩充以适合比较的对象,正如CHAR和VARCHAR。 · 对于BLOB和TEXT列的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的。 · BLOB和TEXT列不能有 默认值。 1.3. ENUM类型ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。 在某些情况下,ENUM值也可以为空字符串('')或NULL: · 如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。后面有详细讨论。 · 如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且 默认值为NULL。如果ENUM列被声明为NOT NULL,其默认值为允许的值列的第1个元素。 每个枚举值有一个索引: · 来自列规定的允许的值列中的值从1开始编号。 · 空字符串错误值的索引值是0。这说明你可以使用下面的SELECT语句来找出分配了非法ENUM值的行: · mysql> SELECT * FROM tbl_name WHERE enum_col=0;· NULL值的索引是NULL。 例如,定义为ENUM的列('one','two','three')可以有下面所示任何值。还显示了每个值的索引: 值 索引 NULL NULL '' 0 'one' 1 'two' 2 'three' 3 枚举最多可以有65,535个元素。 当创建表时,ENUM成员值的尾部空格将自动被删除。 当检索时,保存在ENUM列的值使用列定义中所使用的大小写来显示。请注意可以为ENUM列分配字符集和 校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。 如果在数值上下文中检索一个ENUM值,将返回列值的索引。例如,你可以这样从ENUM列搜索数值值: mysql> SELECT enum_col+0 FROM tbl_name;如果将一个数字保存到ENUM列,数字被视为索引,并且保存的值是该索引对应的枚举成员。(但是,这不适合LOAD DATA,它将所有输入视为字符串)。不建议使用类似数字的枚举值来定义一个ENUM列,因为这很容易引起混淆。例如,下面的列含有字符串值'0'、'1'和'2'的枚举成员,但数值索引值为1、2和3: numbers ENUM('0','1','2')根据枚举成员在列定义中列出的顺序对ENUM值进行排序。(换句话说,ENUM值根据索引编号进行排序)。例如,对于ENUM('a','b'),'a'排在'b'前面,但对于ENUM('b','a'),'b'排在'a'前面。空字符串排在非空字符串前面,并且NULL值排在所有其它枚举值前面。要想防止意想不到的结果,按字母顺序规定ENUM列。还可以使用GROUP BY CAST(col AS CHAR)或GROUP BY CONCAT(col)来确保按照词汇对列进行排序而不是用索引数字。 如果你想要确定一个ENUM列的所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE enum_col,并解析输出中第2列的ENUM定义。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |